--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Node / ReticulumProjects / MeshChatX.git / files / meshchatx / src / backend / rns_filesync_handler.py
Displaying Raw • Download
meshchatx/src/backend/rns_filesync_handler.py e5756d7ab065475a18acdcafc008a767fcff87e0 (e5756d7a) Text, 37.70 KB
T8b949e# SPDX-License-Identifier: 0BSD
T8b949e"""Identity-scoped wrapper around vendored rns_filesync.FileSyncService."""
Tff7b72from T7ee787__future__ Tff7b72import Te6edf3annotations
Tff7b72import T7ee787contextlib
Tff7b72import T7ee787json
Tff7b72import T7ee787os
Tff7b72import T7ee787tempfile
Tff7b72import T7ee787threading
Tff7b72from T7ee787collectionsT7ee787.T7ee787abc Tff7b72import Te6edf3Callable
Tff7b72from T7ee787typing Tff7b72import Te6edf3Any
Tff7b72from T7ee787rns_filesyncT7ee787.T7ee787constants Tff7b72import Te6edf3ANNOUNCE_INTERVAL_DEFAULT
Tff7b72from T7ee787rns_filesyncT7ee787.T7ee787paths Tff7b72import Te6edf3PathJailErrorTb4b4b4, Te6edf3normalize_relpathTb4b4b4, Te6edf3relative_to_root
Tff7b72from T7ee787rns_filesyncT7ee787.T7ee787permissions Tff7b72import Te6edf3PermissionStore
Tff7b72from T7ee787rns_filesyncT7ee787.T7ee787service Tff7b72import Te6edf3FileSyncService
Te6edf3_ALL_ALIASES Tff7b72= Tffa657frozensetTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffallTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffaTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffeveryoneTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff*Ta5d6ff"Tb4b4b4}Tb4b4b4)
T8b949e# Cap for in-app sync-tree uploads (local control plane only).
Te6edf3MANAGER_UPLOAD_MAX_BYTES Tff7b72= T79c0ff64 Tff7b72* T79c0ff1024 Tff7b72* T79c0ff1024
Tff7b72def Td2a8ff_normalize_peer_hashTb4b4b4(Te6edf3valueTb4b4b4: Tffa657str Tff7b72| Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tffa657str Tff7b72| Tff7b72NoneTb4b4b4:
Te6edf3cleaned Tff7b72= Tffa657strTb4b4b4(Te6edf3value Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Ta5d6ff:Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3cleanedTb4b4b4:
Tff7b72return Tff7b72None
Tff7b72if Te6edf3cleaned Tff7b72in Te6edf3_ALL_ALIASESTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffallTa5d6ff"
Tff7b72if Tffa657lenTb4b4b4(Te6edf3cleanedTb4b4b4) Tff7b72!= T79c0ff32Tb4b4b4:
Tff7b72return Tff7b72None
Tff7b72tryTb4b4b4:
Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3cleanedTb4b4b4)
Tff7b72except Tf85149ValueErrorTb4b4b4:
Tff7b72return Tff7b72None
Tff7b72return Te6edf3cleaned
Tff7b72def Td2a8ff_is_forbidden_entry_nameTb4b4b4(Te6edf3nameTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
T8b949e"""Reject hidden and protocol sidecar names in the file manager."""
Te6edf3cleaned Tff7b72= Tffa657strTb4b4b4(Te6edf3name Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3cleaned Tff7b72or Te6edf3cleaned Tff7b72in Tb4b4b4(Ta5d6ff"Ta5d6ff.Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff..Ta5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72True
Tff7b72if Te6edf3cleanedTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ff.Ta5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72True
Tff7b72if Te6edf3cleaned Tff7b72== Ta5d6ff"Ta5d6ff.rns-filesync.dbTa5d6ff" Tff7b72or Te6edf3cleanedTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ff.rns-filesyncTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72True
Tff7b72if Te6edf3cleanedTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ff.rns-xferTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72True
Tff7b72return Tff7b72False
Tff7b72def Td2a8ff_sanitize_upload_basenameTb4b4b4(Te6edf3filenameTb4b4b4: Tffa657str Tff7b72| Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tffa657str Tff7b72| Tff7b72NoneTb4b4b4:
T8b949e"""Keep only a safe basename for uploads. Fail closed on escape tricks."""
Te6edf3raw Tff7b72= Tffa657strTb4b4b4(Te6edf3filename Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3raw Tff7b72or Ta5d6ff"Tffea00\x00Ta5d6ff" Tff7b72in Te6edf3rawTb4b4b4:
Tff7b72return Tff7b72None
Te6edf3base Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffbasenameTb4b4b4(Te6edf3rawTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Tffea00\\Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3base Tff7b72or Te6edf3base Tff7b72in Tb4b4b4(Ta5d6ff"Ta5d6ff.Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff..Ta5d6ff"Tb4b4b4) Tff7b72or Te6edf3_is_forbidden_entry_nameTb4b4b4(Te6edf3baseTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72None
Tff7b72if Ta5d6ff"Ta5d6ff/Ta5d6ff" Tff7b72in Te6edf3base Tff7b72or Ta5d6ff"Tffea00\\Ta5d6ff" Tff7b72in Te6edf3baseTb4b4b4:
Tff7b72return Tff7b72None
Tff7b72return Te6edf3base
Te6edf3_RESERVED_SYNC_TOP Tff7b72= Tffa657frozensetTb4b4b4(
Tb4b4b4{
Ta5d6ff"Ta5d6ffidentityTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffidentity.bakTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffbotsTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffpluginsTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflxmfTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflxmf_routerTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftelephoneTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffrrc_historyTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffrrc_serverTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffrncp_receivedTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffrncp_sharedTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffrncpTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffdatabase-backupsTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffsnapshotsTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffdatabase.dbTa5d6ff"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tff7b72class T56d364RnsFilesyncHandlerTb4b4b4:
T8b949e"""Host FileSync against the shared Reticulum stack for one identity."""
Tff7b72def Tff7b72__init__Tb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3reticulum_instanceTb4b4b4,
Te6edf3identityTb4b4b4,
Te6edf3storage_dirTb4b4b4: Tffa657strTb4b4b4,
Te6edf3emit_callbackTb4b4b4: Te6edf3CallableTb4b4b4[Tb4b4b4[Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4]Tb4b4b4, Tff7b72NoneTb4b4b4] Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffreticulum Tff7b72= Te6edf3reticulum_instance
Tff7b72selfTff7b72.Td2a8ffidentity Tff7b72= Te6edf3identity
Tff7b72selfTff7b72.Td2a8ffstorage_dir Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffrealpathTb4b4b4(Te6edf3storage_dirTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_emit_callback Tff7b72= Te6edf3emit_callback
Tff7b72selfTff7b72.Td2a8ff_lock Tff7b72= Te6edf3threadingTff7b72.Td2a8ffRLockTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffserviceTb4b4b4: Te6edf3FileSyncService Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_permissions_cacheTb4b4b4: Te6edf3PermissionStore Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_root Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstorage_dirTb4b4b4, Ta5d6ff"Ta5d6fffilesyncTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_settings_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_rootTb4b4b4, Ta5d6ff"Ta5d6ffsettings.jsonTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_acl_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_rootTb4b4b4, Ta5d6ff"Ta5d6ffacl.txtTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_sync_directory Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_rootTb4b4b4, Ta5d6ff"Ta5d6ffsyncTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_monitor Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ff_announce_interval Tff7b72= Te6edf3ANNOUNCE_INTERVAL_DEFAULT
Tff7b72selfTff7b72.Td2a8ff_load_settingsTb4b4b4(Tb4b4b4)
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_rootTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_sync_directoryTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72def Td2a8ff_emitTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3event_typeTb4b4b4: Tffa657strTb4b4b4, Te6edf3payloadTb4b4b4: Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4] Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_emit_callbackTb4b4b4:
Tff7b72return
Te6edf3message Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Te6edf3event_typeTb4b4b4}
Tff7b72if Te6edf3payloadTb4b4b4:
Te6edf3messageTff7b72.Td2a8ffupdateTb4b4b4(Te6edf3payloadTb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_emit_callbackTb4b4b4(Te6edf3messageTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass
Tff7b72def Td2a8ff_resolve_sync_directoryTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3pathTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657str Tff7b72| Tff7b72NoneTb4b4b4:
Te6edf3cleaned Tff7b72= Tffa657strTb4b4b4(Te6edf3path Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3cleanedTb4b4b4:
Tff7b72return Tff7b72None
Te6edf3resolved Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffrealpathTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Te6edf3cleanedTb4b4b4)Tb4b4b4)
Te6edf3root Tff7b72= Tff7b72selfTff7b72.Td2a8ffstorage_dir
T8b949e# Never sync the whole identity tree (would expose keys / DB).
Tff7b72if Te6edf3resolved Tff7b72== Te6edf3rootTb4b4b4:
Tff7b72return Tff7b72None
Tff7b72if Tff7b72not Te6edf3resolvedTff7b72.Td2a8ffstartswithTb4b4b4(Te6edf3root Tff7b72+ Te6edf3osTff7b72.Td2a8ffsepTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72None
Te6edf3rel Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffrelpathTb4b4b4(Te6edf3resolvedTb4b4b4, Te6edf3rootTb4b4b4)
Te6edf3first Tff7b72= Te6edf3relTff7b72.Td2a8ffsplitTb4b4b4(Te6edf3osTff7b72.Td2a8ffsepTb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72if Te6edf3first Tff7b72in Te6edf3_RESERVED_SYNC_TOP Tff7b72or Te6edf3firstTff7b72.Td2a8ffendswithTb4b4b4(Ta5d6ff"Ta5d6ff.dbTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72None
Tff7b72return Te6edf3resolved
Tff7b72def Td2a8ff_sync_rootTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
T8b949e"""Real path of the configured sync directory (file manager jail base)."""
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_sync_directoryTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72return Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffrealpathTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_sync_directoryTb4b4b4)
Tff7b72def Td2a8ff_is_under_sync_rootTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3candidateTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
Te6edf3root Tff7b72= Tff7b72selfTff7b72.Td2a8ff_sync_rootTb4b4b4(Tb4b4b4)
Te6edf3real Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffrealpathTb4b4b4(Te6edf3candidateTb4b4b4)
Tff7b72return Te6edf3real Tff7b72== Te6edf3root Tff7b72or Te6edf3realTff7b72.Td2a8ffstartswithTb4b4b4(Te6edf3root Tff7b72+ Te6edf3osTff7b72.Td2a8ffsepTb4b4b4)
Tff7b72def Td2a8ff_resolve_manager_pathTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3pathTb4b4b4: Tffa657str Tff7b72| Tff7b72NoneTb4b4b4,
Tff7b72*Tb4b4b4,
Te6edf3allow_rootTb4b4b4: Tffa657bool Tff7b72= Tff7b72FalseTb4b4b4,
Te6edf3must_existTb4b4b4: Tffa657bool Tff7b72= Tff7b72FalseTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tffa657tupleTb4b4b4[Tffa657str Tff7b72| Tff7b72NoneTb4b4b4, Tffa657str Tff7b72| Tff7b72NoneTb4b4b4]Tb4b4b4:
T8b949e"""Resolve a path for the sync-root file manager.
Returns (abspath, error). Fail closed with a generic error string.
Empty path with allow_root returns the sync root itself.
"""
Te6edf3root Tff7b72= Tff7b72selfTff7b72.Td2a8ff_sync_rootTb4b4b4(Tb4b4b4)
Te6edf3cleaned Tff7b72= Tffa657strTb4b4b4(Te6edf3path Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3cleanedTb4b4b4:
Tff7b72if Te6edf3allow_rootTb4b4b4:
Tff7b72return Te6edf3rootTb4b4b4, Tff7b72None
Tff7b72return Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffpath is requiredTa5d6ff"
T8b949e# Absolute client paths are never accepted for the manager.
Tff7b72if Ta5d6ff"Tffea00\x00Ta5d6ff" Tff7b72in Te6edf3cleanedTb4b4b4:
Tff7b72return Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffpath not allowedTa5d6ff"
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisabsTb4b4b4(Te6edf3cleanedTb4b4b4) Tff7b72or Te6edf3cleanedTff7b72.Td2a8ffstartswithTb4b4b4(Tb4b4b4(Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4, Ta5d6ff"Tffea00\\Ta5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffpath not allowedTa5d6ff"
Tff7b72if Tffa657lenTb4b4b4(Te6edf3cleanedTb4b4b4) Tff7b72>Tff7b72= T79c0ff2 Tff7b72and Te6edf3cleanedTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ff:Ta5d6ff"Tb4b4b4:
Tff7b72return Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffpath not allowedTa5d6ff"
Tff7b72tryTb4b4b4:
Te6edf3safe_rel Tff7b72= Te6edf3normalize_relpathTb4b4b4(Te6edf3cleanedTb4b4b4)
Tff7b72except Te6edf3PathJailErrorTb4b4b4:
Tff7b72return Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffpath not allowedTa5d6ff"
Te6edf3parts Tff7b72= Te6edf3safe_relTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Tffea00\\Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4)
Tff7b72if Tffa657anyTb4b4b4(Te6edf3_is_forbidden_entry_nameTb4b4b4(Te6edf3partTb4b4b4) Tff7b72for Te6edf3part Tff7b72in Te6edf3partsTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffpath not allowedTa5d6ff"
Te6edf3joined Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3rootTb4b4b4, Te6edf3safe_relTb4b4b4)
T8b949e# Reject symlink parents that escape before realpath of missing leaves.
Te6edf3parent Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffdirnameTb4b4b4(Te6edf3joinedTb4b4b4)
Tff7b72if Te6edf3parent Tff7b72!= Te6edf3root Tff7b72and Tff7b72not Tff7b72selfTff7b72.Td2a8ff_is_under_sync_rootTb4b4b4(Te6edf3parentTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffpath not allowedTa5d6ff"
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8fflexistsTb4b4b4(Te6edf3joinedTb4b4b4) Tff7b72and Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffislinkTb4b4b4(Te6edf3joinedTb4b4b4)Tb4b4b4:
Te6edf3real Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffrealpathTb4b4b4(Te6edf3joinedTb4b4b4)
Tff7b72if Te6edf3real Tff7b72!= Te6edf3root Tff7b72and Tff7b72not Te6edf3realTff7b72.Td2a8ffstartswithTb4b4b4(Te6edf3root Tff7b72+ Te6edf3osTff7b72.Td2a8ffsepTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffpath not allowedTa5d6ff"
Tff7b72if Te6edf3must_exist Tff7b72and Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexistsTb4b4b4(Te6edf3realTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffpath not foundTa5d6ff"
Tff7b72return Te6edf3realTb4b4b4, Tff7b72None
Tff7b72if Te6edf3must_exist Tff7b72and Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8fflexistsTb4b4b4(Te6edf3joinedTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffpath not foundTa5d6ff"
Tff7b72tryTb4b4b4:
Te6edf3real Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffrealpathTb4b4b4(Te6edf3joinedTb4b4b4)
Tff7b72except Tf85149OSErrorTb4b4b4:
Tff7b72return Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffpath not allowedTa5d6ff"
Tff7b72if Te6edf3real Tff7b72!= Te6edf3root Tff7b72and Tff7b72not Te6edf3realTff7b72.Td2a8ffstartswithTb4b4b4(Te6edf3root Tff7b72+ Te6edf3osTff7b72.Td2a8ffsepTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffpath not allowedTa5d6ff"
Tff7b72if Tff7b72not Te6edf3allow_root Tff7b72and Te6edf3real Tff7b72== Te6edf3rootTb4b4b4:
Tff7b72return Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffpath not allowedTa5d6ff"
Tff7b72return Te6edf3realTb4b4b4, Tff7b72None
Tff7b72def Td2a8ff_relpath_under_syncTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3abspathTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657str Tff7b72| Tff7b72NoneTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72return Te6edf3relative_to_rootTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_sync_rootTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3abspathTb4b4b4)
Tff7b72except Te6edf3PathJailErrorTb4b4b4:
Tff7b72return Tff7b72None
Tff7b72def Td2a8ff_nudge_inventoryTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3relpathTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffservice Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return
Te6edf3inventory Tff7b72= Tffa657getattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffserviceTb4b4b4, Ta5d6ff"Ta5d6ffinventoryTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72if Te6edf3inventory Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3relpathTb4b4b4:
Te6edf3inventoryTff7b72.Td2a8ffupdate_from_pathTb4b4b4(Te6edf3relpathTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3inventoryTff7b72.Td2a8ffscanTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8fflist_treeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3pathTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
T8b949e"""List files and directories under a relative path inside the sync root."""
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Te6edf3targetTb4b4b4, Te6edf3err Tff7b72= Tff7b72selfTff7b72.Td2a8ff_resolve_manager_pathTb4b4b4(Te6edf3pathTb4b4b4, Te6edf3allow_rootTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72if Te6edf3err Tff7b72or Te6edf3target Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Te6edf3err Tff7b72or Ta5d6ff"Ta5d6ffpath not allowedTa5d6ff"Tb4b4b4}
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3targetTb4b4b4)Tb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffnot a directoryTa5d6ff"Tb4b4b4}
Te6edf3root Tff7b72= Tff7b72selfTff7b72.Td2a8ff_sync_rootTb4b4b4(Tb4b4b4)
Te6edf3entriesTb4b4b4: Tffa657listTb4b4b4[Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72tryTb4b4b4:
Te6edf3names Tff7b72= Tffa657sortedTb4b4b4(Te6edf3osTff7b72.Td2a8fflistdirTb4b4b4(Te6edf3targetTb4b4b4)Tb4b4b4, Te6edf3keyTff7b72=Tffa657strTff7b72.Td2a8fflowerTb4b4b4)
Tff7b72except Tf85149OSError Tff7b72as Te6edf3excTb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Tffa657strTb4b4b4(Te6edf3excTb4b4b4)Tb4b4b4}
Tff7b72for Te6edf3name Tff7b72in Te6edf3namesTb4b4b4:
Tff7b72if Te6edf3_is_forbidden_entry_nameTb4b4b4(Te6edf3nameTb4b4b4)Tb4b4b4:
Tff7b72continue
Te6edf3full Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3targetTb4b4b4, Te6edf3nameTb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffislinkTb4b4b4(Te6edf3fullTb4b4b4)Tb4b4b4:
Te6edf3real Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffrealpathTb4b4b4(Te6edf3fullTb4b4b4)
Tff7b72if Te6edf3real Tff7b72!= Te6edf3root Tff7b72and Tff7b72not Te6edf3realTff7b72.Td2a8ffstartswithTb4b4b4(Te6edf3root Tff7b72+ Te6edf3osTff7b72.Td2a8ffsepTb4b4b4)Tb4b4b4:
Tff7b72continue
Tff7b72elseTb4b4b4:
Te6edf3real Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffrealpathTb4b4b4(Te6edf3fullTb4b4b4)
Tff7b72if Te6edf3real Tff7b72!= Te6edf3root Tff7b72and Tff7b72not Te6edf3realTff7b72.Td2a8ffstartswithTb4b4b4(Te6edf3root Tff7b72+ Te6edf3osTff7b72.Td2a8ffsepTb4b4b4)Tb4b4b4:
Tff7b72continue
Te6edf3is_dir Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3realTb4b4b4) Tff7b72and Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffislinkTb4b4b4(Te6edf3fullTb4b4b4)
T8b949e# Treat in-jail symlinks to dirs as dirs for navigation only when target stays inside.
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffislinkTb4b4b4(Te6edf3fullTb4b4b4) Tff7b72and Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3realTb4b4b4)Tb4b4b4:
Te6edf3is_dir Tff7b72= Tff7b72True
Te6edf3rel Tff7b72= Tff7b72selfTff7b72.Td2a8ff_relpath_under_syncTb4b4b4(Te6edf3realTb4b4b4)
Tff7b72if Te6edf3rel Tff7b72is Tff7b72None Tff7b72and Te6edf3real Tff7b72== Te6edf3rootTb4b4b4:
Tff7b72continue
Tff7b72if Te6edf3rel Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72continue
Te6edf3itemTb4b4b4: Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4] Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Te6edf3nameTb4b4b4,
Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4: Te6edf3relTb4b4b4,
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffdirTa5d6ff" Tff7b72if Te6edf3is_dir Tff7b72else Ta5d6ff"Ta5d6fffileTa5d6ff"Tb4b4b4,
Tb4b4b4}
Tff7b72if Tff7b72not Te6edf3is_dirTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3itemTb4b4b4[Ta5d6ff"Ta5d6ffsizeTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffgetsizeTb4b4b4(Te6edf3realTb4b4b4)
Tff7b72except Tf85149OSErrorTb4b4b4:
Te6edf3itemTb4b4b4[Ta5d6ff"Ta5d6ffsizeTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0
Te6edf3entriesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3itemTb4b4b4)
Te6edf3current_rel Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72if Te6edf3target Tff7b72!= Te6edf3rootTb4b4b4:
Te6edf3current_rel Tff7b72= Tff7b72selfTff7b72.Td2a8ff_relpath_under_syncTb4b4b4(Te6edf3targetTb4b4b4) Tff7b72or Ta5d6ff"Ta5d6ff"
Te6edf3parent_rel Tff7b72= Tff7b72None
Tff7b72if Te6edf3target Tff7b72!= Te6edf3rootTb4b4b4:
Te6edf3parent_abs Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffdirnameTb4b4b4(Te6edf3targetTb4b4b4)
Tff7b72if Te6edf3parent_abs Tff7b72== Te6edf3rootTb4b4b4:
Te6edf3parent_rel Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3parent_rel Tff7b72= Tff7b72selfTff7b72.Td2a8ff_relpath_under_syncTb4b4b4(Te6edf3parent_absTb4b4b4)
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4,
Ta5d6ff"Ta5d6ffrootTa5d6ff"Tb4b4b4: Te6edf3rootTb4b4b4,
Ta5d6ff"Ta5d6ffcurrentTa5d6ff"Tb4b4b4: Te6edf3current_relTb4b4b4,
Ta5d6ff"Ta5d6ffparentTa5d6ff"Tb4b4b4: Te6edf3parent_relTb4b4b4,
Ta5d6ff"Ta5d6ffentriesTa5d6ff"Tb4b4b4: Te6edf3entriesTb4b4b4,
Tb4b4b4}
Tff7b72def Td2a8ffmanager_mkdirTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3pathTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
T8b949e"""Create a directory under the sync root (relative path)."""
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Te6edf3cleaned Tff7b72= Tffa657strTb4b4b4(Te6edf3path Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3cleanedTb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffpath is requiredTa5d6ff"Tb4b4b4}
T8b949e# Resolve parent and create leaf so we do not require the leaf to exist.
Tff7b72tryTb4b4b4:
Te6edf3safe_rel Tff7b72= Te6edf3normalize_relpathTb4b4b4(Te6edf3cleanedTb4b4b4)
Tff7b72except Te6edf3PathJailErrorTb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffpath not allowedTa5d6ff"Tb4b4b4}
Te6edf3parts Tff7b72= Te6edf3safe_relTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Tffea00\\Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4)
Tff7b72if Tffa657anyTb4b4b4(Te6edf3_is_forbidden_entry_nameTb4b4b4(Te6edf3partTb4b4b4) Tff7b72for Te6edf3part Tff7b72in Te6edf3partsTb4b4b4)Tb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffpath not allowedTa5d6ff"Tb4b4b4}
Te6edf3leaf Tff7b72= Te6edf3partsTb4b4b4[Tff7b72-T79c0ff1Tb4b4b4]
Te6edf3parent_rel Tff7b72= Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3partsTb4b4b4[Tb4b4b4:Tff7b72-T79c0ff1Tb4b4b4]Tb4b4b4) Tff7b72if Tffa657lenTb4b4b4(Te6edf3partsTb4b4b4) Tff7b72> T79c0ff1 Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3parent_absTb4b4b4, Te6edf3err Tff7b72= Tff7b72selfTff7b72.Td2a8ff_resolve_manager_pathTb4b4b4(
Te6edf3parent_rel Tff7b72if Te6edf3parent_rel Tff7b72else Tff7b72NoneTb4b4b4,
Te6edf3allow_rootTff7b72=Tff7b72TrueTb4b4b4,
Te6edf3must_existTff7b72=Tff7b72TrueTb4b4b4,
Tb4b4b4)
Tff7b72if Te6edf3err Tff7b72or Te6edf3parent_abs Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Te6edf3err Tff7b72or Ta5d6ff"Ta5d6ffpath not allowedTa5d6ff"Tb4b4b4}
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3parent_absTb4b4b4)Tb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffparent is not a directoryTa5d6ff"Tb4b4b4}
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffislinkTb4b4b4(Te6edf3parent_absTb4b4b4)Tb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffpath not allowedTa5d6ff"Tb4b4b4}
Te6edf3new_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3parent_absTb4b4b4, Te6edf3leafTb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_is_under_sync_rootTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffdirnameTb4b4b4(Te6edf3new_pathTb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffpath not allowedTa5d6ff"Tb4b4b4}
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8fflexistsTb4b4b4(Te6edf3new_pathTb4b4b4)Tb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffalready existsTa5d6ff"Tb4b4b4}
Tff7b72tryTb4b4b4:
Te6edf3osTff7b72.Td2a8ffmkdirTb4b4b4(Te6edf3new_pathTb4b4b4)
Tff7b72except Tf85149OSError Tff7b72as Te6edf3excTb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Tffa657strTb4b4b4(Te6edf3excTb4b4b4)Tb4b4b4}
Te6edf3real Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffrealpathTb4b4b4(Te6edf3new_pathTb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_is_under_sync_rootTb4b4b4(Te6edf3realTb4b4b4)Tb4b4b4:
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149OSErrorTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffrmdirTb4b4b4(Te6edf3new_pathTb4b4b4)
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffpath not allowedTa5d6ff"Tb4b4b4}
Te6edf3rel Tff7b72= Tff7b72selfTff7b72.Td2a8ff_relpath_under_syncTb4b4b4(Te6edf3realTb4b4b4) Tff7b72or Te6edf3safe_rel
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4, Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4: Te6edf3relTb4b4b4}
Tff7b72def Td2a8ffmanager_uploadTb4b4b4(
Tff7b72selfTb4b4b4,
Tff7b72*Tb4b4b4,
Te6edf3filenameTb4b4b4: Tffa657str Tff7b72| Tff7b72NoneTb4b4b4,
Te6edf3dataTb4b4b4: Tffa657bytesTb4b4b4,
Te6edf3subdirTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
T8b949e"""Write an uploaded file under the sync root."""
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3dataTb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657bytearrayTb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffinvalid upload dataTa5d6ff"Tb4b4b4}
Tff7b72if Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4) Tff7b72> Te6edf3MANAGER_UPLOAD_MAX_BYTESTb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffupload too largeTa5d6ff"Tb4b4b4}
Te6edf3base Tff7b72= Te6edf3_sanitize_upload_basenameTb4b4b4(Te6edf3filenameTb4b4b4)
Tff7b72if Te6edf3base Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffinvalid filenameTa5d6ff"Tb4b4b4}
Te6edf3parent_absTb4b4b4, Te6edf3err Tff7b72= Tff7b72selfTff7b72.Td2a8ff_resolve_manager_pathTb4b4b4(
Te6edf3subdirTb4b4b4,
Te6edf3allow_rootTff7b72=Tff7b72TrueTb4b4b4,
Te6edf3must_existTff7b72=Tff7b72TrueTb4b4b4,
Tb4b4b4)
Tff7b72if Te6edf3err Tff7b72or Te6edf3parent_abs Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Te6edf3err Tff7b72or Ta5d6ff"Ta5d6ffpath not allowedTa5d6ff"Tb4b4b4}
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3parent_absTb4b4b4) Tff7b72or Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffislinkTb4b4b4(Te6edf3parent_absTb4b4b4)Tb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffpath not allowedTa5d6ff"Tb4b4b4}
Te6edf3dest Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3parent_absTb4b4b4, Te6edf3baseTb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffislinkTb4b4b4(Te6edf3destTb4b4b4)Tb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffpath not allowedTa5d6ff"Tb4b4b4}
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8fflexistsTb4b4b4(Te6edf3destTb4b4b4)Tb4b4b4:
Te6edf3real_existing Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffrealpathTb4b4b4(Te6edf3destTb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_is_under_sync_rootTb4b4b4(Te6edf3real_existingTb4b4b4)Tb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffpath not allowedTa5d6ff"Tb4b4b4}
Te6edf3tmp_path Tff7b72= Tff7b72None
Tff7b72tryTb4b4b4:
Te6edf3fdTb4b4b4, Te6edf3tmp_path Tff7b72= Te6edf3tempfileTff7b72.Td2a8ffmkstempTb4b4b4(
Te6edf3prefixTff7b72=Ta5d6ff"Ta5d6ff.upload-Ta5d6ff"Tb4b4b4,
Te6edf3suffixTff7b72=Ta5d6ff"Ta5d6ff.tmpTa5d6ff"Tb4b4b4,
Tffa657dirTff7b72=Te6edf3parent_absTb4b4b4,
Tb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72with Te6edf3osTff7b72.Td2a8fffdopenTb4b4b4(Te6edf3fdTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3handleTb4b4b4:
Te6edf3handleTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149OSErrorTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffcloseTb4b4b4(Te6edf3fdTb4b4b4)
Tff7b72raise
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_is_under_sync_rootTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149OSErrorTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffunlinkTb4b4b4(Te6edf3tmp_pathTb4b4b4)
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffpath not allowedTa5d6ff"Tb4b4b4}
Te6edf3osTff7b72.Td2a8ffreplaceTb4b4b4(Te6edf3tmp_pathTb4b4b4, Te6edf3destTb4b4b4)
Te6edf3tmp_path Tff7b72= Tff7b72None
Tff7b72except Tf85149OSError Tff7b72as Te6edf3excTb4b4b4:
Tff7b72if Te6edf3tmp_pathTb4b4b4:
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149OSErrorTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffunlinkTb4b4b4(Te6edf3tmp_pathTb4b4b4)
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Tffa657strTb4b4b4(Te6edf3excTb4b4b4)Tb4b4b4}
Te6edf3real Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffrealpathTb4b4b4(Te6edf3destTb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_is_under_sync_rootTb4b4b4(Te6edf3realTb4b4b4) Tff7b72or Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3realTb4b4b4)Tb4b4b4:
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149OSErrorTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffunlinkTb4b4b4(Te6edf3destTb4b4b4)
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffpath not allowedTa5d6ff"Tb4b4b4}
Te6edf3rel Tff7b72= Tff7b72selfTff7b72.Td2a8ff_relpath_under_syncTb4b4b4(Te6edf3realTb4b4b4)
Tff7b72if Te6edf3rel Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149OSErrorTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffunlinkTb4b4b4(Te6edf3destTb4b4b4)
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffpath not allowedTa5d6ff"Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ff_nudge_inventoryTb4b4b4(Te6edf3relTb4b4b4)
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4, Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4: Te6edf3relTb4b4b4, Ta5d6ff"Ta5d6ffsizeTa5d6ff"Tb4b4b4: Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4}
Tff7b72def Td2a8ffmanager_deleteTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3pathTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
T8b949e"""Delete a file or empty directory under the sync root."""
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Te6edf3root Tff7b72= Tff7b72selfTff7b72.Td2a8ff_sync_rootTb4b4b4(Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3safe_rel Tff7b72= Te6edf3normalize_relpathTb4b4b4(Tffa657strTb4b4b4(Te6edf3path Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72except Te6edf3PathJailErrorTb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffpath not allowedTa5d6ff"Tb4b4b4}
Te6edf3lex_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3rootTb4b4b4, Te6edf3safe_relTb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffislinkTb4b4b4(Te6edf3lex_pathTb4b4b4)Tb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffpath not allowedTa5d6ff"Tb4b4b4}
Te6edf3targetTb4b4b4, Te6edf3err Tff7b72= Tff7b72selfTff7b72.Td2a8ff_resolve_manager_pathTb4b4b4(
Te6edf3pathTb4b4b4,
Te6edf3allow_rootTff7b72=Tff7b72FalseTb4b4b4,
Te6edf3must_existTff7b72=Tff7b72TrueTb4b4b4,
Tb4b4b4)
Tff7b72if Te6edf3err Tff7b72or Te6edf3target Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Te6edf3err Tff7b72or Ta5d6ff"Ta5d6ffpath not allowedTa5d6ff"Tb4b4b4}
Tff7b72if Te6edf3target Tff7b72== Te6edf3rootTb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffpath not allowedTa5d6ff"Tb4b4b4}
Te6edf3rel Tff7b72= Tff7b72selfTff7b72.Td2a8ff_relpath_under_syncTb4b4b4(Te6edf3targetTb4b4b4)
Tff7b72if Te6edf3rel Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffpath not allowedTa5d6ff"Tb4b4b4}
Tff7b72tryTb4b4b4:
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3targetTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3osTff7b72.Td2a8ffrmdirTb4b4b4(Te6edf3targetTb4b4b4)
Tff7b72except Tf85149OSErrorTb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffdirectory is not emptyTa5d6ff"Tb4b4b4}
Tff7b72elif Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3targetTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffunlinkTb4b4b4(Te6edf3targetTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffpath not foundTa5d6ff"Tb4b4b4}
Tff7b72except Tf85149OSError Tff7b72as Te6edf3excTb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Tffa657strTb4b4b4(Te6edf3excTb4b4b4)Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ff_nudge_inventoryTb4b4b4(Te6edf3relTb4b4b4)
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4, Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4: Te6edf3relTb4b4b4}
Tff7b72def Td2a8ffmanager_contentTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3pathTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
T8b949e"""Resolve a file under the sync root for download streaming."""
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Te6edf3root Tff7b72= Tff7b72selfTff7b72.Td2a8ff_sync_rootTb4b4b4(Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3safe_rel Tff7b72= Te6edf3normalize_relpathTb4b4b4(Tffa657strTb4b4b4(Te6edf3path Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72except Te6edf3PathJailErrorTb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffpath not allowedTa5d6ff"Tb4b4b4}
Te6edf3lex_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3rootTb4b4b4, Te6edf3safe_relTb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffislinkTb4b4b4(Te6edf3lex_pathTb4b4b4)Tb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffpath not allowedTa5d6ff"Tb4b4b4}
Te6edf3targetTb4b4b4, Te6edf3err Tff7b72= Tff7b72selfTff7b72.Td2a8ff_resolve_manager_pathTb4b4b4(
Te6edf3pathTb4b4b4,
Te6edf3allow_rootTff7b72=Tff7b72FalseTb4b4b4,
Te6edf3must_existTff7b72=Tff7b72TrueTb4b4b4,
Tb4b4b4)
Tff7b72if Te6edf3err Tff7b72or Te6edf3target Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Te6edf3err Tff7b72or Ta5d6ff"Ta5d6ffpath not allowedTa5d6ff"Tb4b4b4}
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3targetTb4b4b4)Tb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffnot a fileTa5d6ff"Tb4b4b4}
Te6edf3rel Tff7b72= Tff7b72selfTff7b72.Td2a8ff_relpath_under_syncTb4b4b4(Te6edf3targetTb4b4b4)
Tff7b72if Te6edf3rel Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffpath not allowedTa5d6ff"Tb4b4b4}
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4,
Ta5d6ff"Ta5d6ffabspathTa5d6ff"Tb4b4b4: Te6edf3targetTb4b4b4,
Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4: Te6edf3relTb4b4b4,
Ta5d6ff"Ta5d6fffilenameTa5d6ff"Tb4b4b4: Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffbasenameTb4b4b4(Te6edf3targetTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffsizeTa5d6ff"Tb4b4b4: Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffgetsizeTb4b4b4(Te6edf3targetTb4b4b4)Tb4b4b4,
Tb4b4b4}
Tff7b72def Td2a8ff_load_settingsTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_rootTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_settings_pathTb4b4b4)Tb4b4b4:
Tff7b72return
Tff7b72tryTb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_settings_pathTb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4) Tff7b72as Te6edf3handleTb4b4b4:
Te6edf3data Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadTb4b4b4(Te6edf3handleTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72return
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3dataTb4b4b4, Tffa657dictTb4b4b4)Tb4b4b4:
Tff7b72return
Te6edf3sync_dir Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffsync_directoryTa5d6ff"Tb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3sync_dirTb4b4b4, Tffa657strTb4b4b4) Tff7b72and Te6edf3sync_dirTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3resolved Tff7b72= Tff7b72selfTff7b72.Td2a8ff_resolve_sync_directoryTb4b4b4(Te6edf3sync_dirTb4b4b4)
Tff7b72if Te6edf3resolved Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_sync_directory Tff7b72= Te6edf3resolved
Te6edf3monitor Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffmonitorTa5d6ff"Tb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3monitorTb4b4b4, Tffa657boolTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_monitor Tff7b72= Te6edf3monitor
Te6edf3interval Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffannounce_intervalTa5d6ff"Tb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3intervalTb4b4b4, Tffa657intTb4b4b4) Tff7b72and Te6edf3interval Tff7b72>Tff7b72= T79c0ff10Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_announce_interval Tff7b72= Te6edf3interval
Tff7b72def Td2a8ff_save_settingsTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_rootTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3payload Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffsync_directoryTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_sync_directoryTb4b4b4,
Ta5d6ff"Ta5d6ffmonitorTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_monitorTb4b4b4,
Ta5d6ff"Ta5d6ffannounce_intervalTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_announce_intervalTb4b4b4,
Tb4b4b4}
Te6edf3tmp Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTff7b72.Td2a8ff_settings_pathTffd700}Ta5d6ff.tmpTa5d6ff"
Tff7b72with Tffa657openTb4b4b4(Te6edf3tmpTb4b4b4, Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4) Tff7b72as Te6edf3handleTb4b4b4:
Te6edf3jsonTff7b72.Td2a8ffdumpTb4b4b4(Te6edf3payloadTb4b4b4, Te6edf3handleTb4b4b4, Te6edf3indentTff7b72=T79c0ff2Tb4b4b4, Te6edf3sort_keysTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3handleTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3osTff7b72.Td2a8ffreplaceTb4b4b4(Te6edf3tmpTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_settings_pathTb4b4b4)
Tff7b72def Td2a8ff_load_permissionsTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3PermissionStoreTb4b4b4:
Te6edf3permissions Tff7b72= Te6edf3PermissionStoreTb4b4b4(Tb4b4b4)
Te6edf3enforce_overrideTb4b4b4: Tffa657bool Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_acl_pathTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_acl_pathTb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4) Tff7b72as Te6edf3handleTb4b4b4:
Te6edf3text Tff7b72= Te6edf3handleTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Te6edf3lines Tff7b72= Te6edf3textTff7b72.Td2a8ffsplitlinesTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3linesTb4b4b4:
Te6edf3first Tff7b72= Te6edf3linesTb4b4b4[T79c0ff0Tb4b4b4]Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3first Tff7b72== Ta5d6ff"Ta5d6ff# enforce=falseTa5d6ff"Tb4b4b4:
Te6edf3enforce_override Tff7b72= Tff7b72False
Tff7b72elif Te6edf3first Tff7b72== Ta5d6ff"Ta5d6ff# enforce=trueTa5d6ff"Tb4b4b4:
Te6edf3enforce_override Tff7b72= Tff7b72True
Te6edf3permissionsTff7b72.Td2a8ffload_allowed_textTb4b4b4(Te6edf3textTb4b4b4)
Tff7b72if Te6edf3enforce_override Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3permissionsTff7b72.Td2a8ff_enforce Tff7b72= Te6edf3enforce_override
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass
Tff7b72return Te6edf3permissions
Tff7b72def Td2a8ff_save_aclTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3permissionsTb4b4b4: Te6edf3PermissionStoreTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_rootTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3linesTb4b4b4: Tffa657listTb4b4b4[Tffa657strTb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3rules Tff7b72= Te6edf3permissionsTff7b72.Td2a8ffas_dictTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3perm Tff7b72in Tb4b4b4(Ta5d6ff"Ta5d6ffreadTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffwriteTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdeleteTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3target Tff7b72in Te6edf3rulesTff7b72.Td2a8ffgetTb4b4b4(Te6edf3permTb4b4b4, Tb4b4b4[Tb4b4b4]Tb4b4b4)Tb4b4b4:
Te6edf3short Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffreadTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffrTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffwriteTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdeleteTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffdTa5d6ff"Tb4b4b4}Tb4b4b4[Te6edf3permTb4b4b4]
Te6edf3linesTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3shortTffd700}Ta5d6ff:Tffd700{Te6edf3targetTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3permissionsTff7b72.Td2a8ffenabledTb4b4b4:
Te6edf3linesTff7b72.Td2a8ffinsertTb4b4b4(T79c0ff0Tb4b4b4, Ta5d6ff"Ta5d6ff# enforce=trueTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3linesTff7b72.Td2a8ffinsertTb4b4b4(T79c0ff0Tb4b4b4, Ta5d6ff"Ta5d6ff# enforce=falseTa5d6ff"Tb4b4b4)
Te6edf3tmp Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTff7b72.Td2a8ff_acl_pathTffd700}Ta5d6ff.tmpTa5d6ff"
Tff7b72with Tffa657openTb4b4b4(Te6edf3tmpTb4b4b4, Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4) Tff7b72as Te6edf3handleTb4b4b4:
Te6edf3handleTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3linesTb4b4b4) Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3osTff7b72.Td2a8ffreplaceTb4b4b4(Te6edf3tmpTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_acl_pathTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_permissions_cache Tff7b72= Te6edf3permissions
Tff7b72def Td2a8ff_wire_callbacksTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3serviceTb4b4b4: Te6edf3FileSyncServiceTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Te6edf3serviceTff7b72.Td2a8ffon_peer_connected Tff7b72= Tff7b72lambda Te6edf3payloadTb4b4b4: Tff7b72selfTff7b72.Td2a8ff_emitTb4b4b4(
Ta5d6ff"Ta5d6fffilesync.peer.connectedTa5d6ff"Tb4b4b4,
Te6edf3payload Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3payloadTb4b4b4, Tffa657dictTb4b4b4) Tff7b72else Tb4b4b4{Ta5d6ff"Ta5d6ffpeerTa5d6ff"Tb4b4b4: Te6edf3payloadTb4b4b4}Tb4b4b4,
Tb4b4b4)
Te6edf3serviceTff7b72.Td2a8ffon_peer_disconnected Tff7b72= Tff7b72lambda Te6edf3payloadTb4b4b4: Tff7b72selfTff7b72.Td2a8ff_emitTb4b4b4(
Ta5d6ff"Ta5d6fffilesync.peer.disconnectedTa5d6ff"Tb4b4b4,
Te6edf3payload Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3payloadTb4b4b4, Tffa657dictTb4b4b4) Tff7b72else Tb4b4b4{Ta5d6ff"Ta5d6ffpeerTa5d6ff"Tb4b4b4: Te6edf3payloadTb4b4b4}Tb4b4b4,
Tb4b4b4)
Te6edf3serviceTff7b72.Td2a8ffon_sync_progress Tff7b72= Tff7b72lambda Te6edf3payloadTb4b4b4: Tff7b72selfTff7b72.Td2a8ff_emitTb4b4b4(
Ta5d6ff"Ta5d6fffilesync.sync.progressTa5d6ff"Tb4b4b4,
Te6edf3payload Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3payloadTb4b4b4, Tffa657dictTb4b4b4) Tff7b72else Tb4b4b4{Ta5d6ff"Ta5d6ffprogressTa5d6ff"Tb4b4b4: Te6edf3payloadTb4b4b4}Tb4b4b4,
Tb4b4b4)
Te6edf3serviceTff7b72.Td2a8ffon_file_updated Tff7b72= Tff7b72lambda Te6edf3payloadTb4b4b4: Tff7b72selfTff7b72.Td2a8ff_emitTb4b4b4(
Ta5d6ff"Ta5d6fffilesync.file.updatedTa5d6ff"Tb4b4b4,
Te6edf3payload Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3payloadTb4b4b4, Tffa657dictTb4b4b4) Tff7b72else Tb4b4b4{Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4: Te6edf3payloadTb4b4b4}Tb4b4b4,
Tb4b4b4)
Te6edf3serviceTff7b72.Td2a8ffon_file_deleted Tff7b72= Tff7b72lambda Te6edf3payloadTb4b4b4: Tff7b72selfTff7b72.Td2a8ff_emitTb4b4b4(
Ta5d6ff"Ta5d6fffilesync.file.deletedTa5d6ff"Tb4b4b4,
Te6edf3payload Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3payloadTb4b4b4, Tffa657dictTb4b4b4) Tff7b72else Tb4b4b4{Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4: Te6edf3payloadTb4b4b4}Tb4b4b4,
Tb4b4b4)
Te6edf3serviceTff7b72.Td2a8ffon_error Tff7b72= Tff7b72lambda Te6edf3payloadTb4b4b4: Tff7b72selfTff7b72.Td2a8ff_emitTb4b4b4(
Ta5d6ff"Ta5d6fffilesync.errorTa5d6ff"Tb4b4b4,
Te6edf3payload Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3payloadTb4b4b4, Tffa657dictTb4b4b4) Tff7b72else Tb4b4b4{Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Tffa657strTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tff7b72def Td2a8ff_permissionsTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Te6edf3PermissionStoreTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffservice Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffserviceTff7b72.Td2a8ffpermissions
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_permissions_cache Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_permissions_cache
Tff7b72selfTff7b72.Td2a8ff_permissions_cache Tff7b72= Tff7b72selfTff7b72.Td2a8ff_load_permissionsTb4b4b4(Tb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_permissions_cache
Tff7b72def Td2a8ffget_statusTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffservice Tff7b72is Tff7b72not Tff7b72None Tff7b72and Tff7b72selfTff7b72.Td2a8ffserviceTff7b72.Td2a8ffget_statusTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffrunningTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3status Tff7b72= Tff7b72selfTff7b72.Td2a8ffserviceTff7b72.Td2a8ffget_statusTb4b4b4(Tb4b4b4)
Te6edf3statusTb4b4b4[Ta5d6ff"Ta5d6ffmonitorTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ff_monitor
Te6edf3statusTb4b4b4[Ta5d6ff"Ta5d6ffannounce_intervalTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ff_announce_interval
Te6edf3statusTb4b4b4[Ta5d6ff"Ta5d6ffconfig_directoryTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ff_root
Te6edf3statusTb4b4b4[Ta5d6ff"Ta5d6ffstorage_directoryTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ffstorage_dir
Tff7b72return Te6edf3status
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6ffrunningTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4,
Ta5d6ff"Ta5d6ffsync_directoryTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_sync_directoryTb4b4b4,
Ta5d6ff"Ta5d6ffidentity_hashTa5d6ff"Tb4b4b4: Tb4b4b4(
Tff7b72selfTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)
Tff7b72if Tffa657getattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentityTb4b4b4, Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4) Tff7b72is Tff7b72not Tff7b72None
Tff7b72else Tff7b72None
Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6ffpeersTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6fffilesTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffwhitelistTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_permissionsTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffenabledTb4b4b4,
Ta5d6ff"Ta5d6ffmonitorTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_monitorTb4b4b4,
Ta5d6ff"Ta5d6ffannounce_intervalTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_announce_intervalTb4b4b4,
Ta5d6ff"Ta5d6ffconfig_directoryTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_rootTb4b4b4,
Ta5d6ff"Ta5d6ffstorage_directoryTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffstorage_dirTb4b4b4,
Tb4b4b4}
Tff7b72def Td2a8fflist_directoriesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3pathTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
T8b949e"""List subdirectories under identity storage for the folder browser."""
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Te6edf3root Tff7b72= Tff7b72selfTff7b72.Td2a8ffstorage_dir
Te6edf3cleaned Tff7b72= Tffa657strTb4b4b4(Te6edf3path Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3cleanedTb4b4b4:
Te6edf3target Tff7b72= Tff7b72selfTff7b72.Td2a8ff_resolve_sync_directoryTb4b4b4(Te6edf3cleanedTb4b4b4)
Tff7b72if Te6edf3target Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4,
Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffpath must stay under identity storageTa5d6ff"Tb4b4b4,
Tb4b4b4}
Tff7b72elseTb4b4b4:
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_rootTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3target Tff7b72= Tff7b72selfTff7b72.Td2a8ff_root
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3targetTb4b4b4)Tb4b4b4:
T8b949e# Default sync path can appear in status before the folder exists.
T8b949e# Walk up to the nearest existing directory still inside the jail.
Te6edf3cursor Tff7b72= Te6edf3target
Tff7b72while Tff7b72TrueTb4b4b4:
Te6edf3parent Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffdirnameTb4b4b4(Te6edf3cursorTb4b4b4)
Tff7b72if Te6edf3parent Tff7b72== Te6edf3cursorTb4b4b4:
Tff7b72break
Tff7b72if Te6edf3parent Tff7b72!= Te6edf3root Tff7b72and Tff7b72not Te6edf3parentTff7b72.Td2a8ffstartswithTb4b4b4(Te6edf3root Tff7b72+ Te6edf3osTff7b72.Td2a8ffsepTb4b4b4)Tb4b4b4:
Tff7b72break
Te6edf3cursor Tff7b72= Te6edf3parent
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3cursorTb4b4b4)Tb4b4b4:
Te6edf3target Tff7b72= Te6edf3cursor
Tff7b72break
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3targetTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_rootTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3target Tff7b72= Tff7b72selfTff7b72.Td2a8ff_root
Te6edf3entriesTb4b4b4: Tffa657listTb4b4b4[Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Tffa657strTb4b4b4]Tb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72tryTb4b4b4:
Tff7b72for Te6edf3name Tff7b72in Tffa657sortedTb4b4b4(Te6edf3osTff7b72.Td2a8fflistdirTb4b4b4(Te6edf3targetTb4b4b4)Tb4b4b4, Te6edf3keyTff7b72=Tffa657strTff7b72.Td2a8fflowerTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3nameTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ff.Ta5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72continue
Te6edf3full Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3targetTb4b4b4, Te6edf3nameTb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3fullTb4b4b4)Tb4b4b4:
Tff7b72continue
Te6edf3resolved Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffrealpathTb4b4b4(Te6edf3fullTb4b4b4)
Tff7b72if Te6edf3resolved Tff7b72!= Te6edf3root Tff7b72and Tff7b72not Te6edf3resolvedTff7b72.Td2a8ffstartswithTb4b4b4(Te6edf3root Tff7b72+ Te6edf3osTff7b72.Td2a8ffsepTb4b4b4)Tb4b4b4:
Tff7b72continue
Te6edf3entriesTff7b72.Td2a8ffappendTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Te6edf3nameTb4b4b4, Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4: Te6edf3resolvedTb4b4b4}Tb4b4b4)
Tff7b72except Tf85149OSError Tff7b72as Te6edf3excTb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Tffa657strTb4b4b4(Te6edf3excTb4b4b4)Tb4b4b4}
Te6edf3current Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffrealpathTb4b4b4(Te6edf3targetTb4b4b4)
Te6edf3parent Tff7b72= Tff7b72None
Tff7b72if Te6edf3current Tff7b72!= Te6edf3rootTb4b4b4:
Te6edf3candidate Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffdirnameTb4b4b4(Te6edf3currentTb4b4b4)
Tff7b72if Te6edf3candidate Tff7b72== Te6edf3root Tff7b72or Te6edf3candidateTff7b72.Td2a8ffstartswithTb4b4b4(Te6edf3root Tff7b72+ Te6edf3osTff7b72.Td2a8ffsepTb4b4b4)Tb4b4b4:
Te6edf3parent Tff7b72= Te6edf3candidate
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4,
Ta5d6ff"Ta5d6ffrootTa5d6ff"Tb4b4b4: Te6edf3rootTb4b4b4,
Ta5d6ff"Ta5d6ffcurrentTa5d6ff"Tb4b4b4: Te6edf3currentTb4b4b4,
Ta5d6ff"Ta5d6ffparentTa5d6ff"Tb4b4b4: Te6edf3parentTb4b4b4,
Ta5d6ff"Ta5d6ffdirectoriesTa5d6ff"Tb4b4b4: Te6edf3entriesTb4b4b4,
Tb4b4b4}
Tff7b72def Td2a8ffcreate_directoryTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3parentTb4b4b4: Tffa657str Tff7b72| Tff7b72NoneTb4b4b4, Te6edf3nameTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
T8b949e"""Create a subdirectory under identity storage for sync folders."""
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Te6edf3cleaned_name Tff7b72= Tffa657strTb4b4b4(Te6edf3name Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72if Tb4b4b4(
Tff7b72not Te6edf3cleaned_name
Tff7b72or Te6edf3cleaned_name Tff7b72in Tb4b4b4(Ta5d6ff"Ta5d6ff.Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff..Ta5d6ff"Tb4b4b4)
Tff7b72or Ta5d6ff"Ta5d6ff/Ta5d6ff" Tff7b72in Te6edf3cleaned_name
Tff7b72or Ta5d6ff"Tffea00\\Ta5d6ff" Tff7b72in Te6edf3cleaned_name
Tff7b72or Te6edf3cleaned_nameTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ff.Ta5d6ff"Tb4b4b4)
Tb4b4b4)Tb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffinvalid directory nameTa5d6ff"Tb4b4b4}
Te6edf3parent_cleaned Tff7b72= Tffa657strTb4b4b4(Te6edf3parent Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3parent_cleanedTb4b4b4:
Te6edf3parent_resolved Tff7b72= Tff7b72selfTff7b72.Td2a8ff_resolve_sync_directoryTb4b4b4(Te6edf3parent_cleanedTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_rootTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3parent_resolved Tff7b72= Tff7b72selfTff7b72.Td2a8ff_root
Tff7b72if Te6edf3parent_resolved Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4,
Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffparent must stay under identity storageTa5d6ff"Tb4b4b4,
Tb4b4b4}
Te6edf3new_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3parent_resolvedTb4b4b4, Te6edf3cleaned_nameTb4b4b4)
Te6edf3resolved Tff7b72= Tff7b72selfTff7b72.Td2a8ff_resolve_sync_directoryTb4b4b4(Te6edf3new_pathTb4b4b4)
Tff7b72if Te6edf3resolved Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4,
Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffpath must stay under identity storageTa5d6ff"Tb4b4b4,
Tb4b4b4}
Tff7b72tryTb4b4b4:
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3resolvedTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72FalseTb4b4b4)
Tff7b72except Tf85149FileExistsErrorTb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffdirectory already existsTa5d6ff"Tb4b4b4}
Tff7b72except Tf85149OSError Tff7b72as Te6edf3excTb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Tffa657strTb4b4b4(Te6edf3excTb4b4b4)Tb4b4b4}
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4, Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4: Te6edf3resolvedTb4b4b4}
Tff7b72def Td2a8ffstartTb4b4b4(
Tff7b72selfTb4b4b4,
Tff7b72*Tb4b4b4,
Te6edf3sync_directoryTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Te6edf3monitorTb4b4b4: Tffa657bool Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Te6edf3announce_intervalTb4b4b4: Tffa657int Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72if Te6edf3sync_directory Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3resolved Tff7b72= Tff7b72selfTff7b72.Td2a8ff_resolve_sync_directoryTb4b4b4(Te6edf3sync_directoryTb4b4b4)
Tff7b72if Te6edf3resolved Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4,
Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffsync_directory must stay under identity storageTa5d6ff"Tb4b4b4,
Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ff_sync_directory Tff7b72= Te6edf3resolved
Tff7b72if Te6edf3monitor Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_monitor Tff7b72= Tffa657boolTb4b4b4(Te6edf3monitorTb4b4b4)
Tff7b72if Te6edf3announce_interval Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3interval Tff7b72= Tffa657intTb4b4b4(Te6edf3announce_intervalTb4b4b4)
Tff7b72except Tb4b4b4(Tf85149TypeErrorTb4b4b4, Tf85149ValueErrorTb4b4b4)Tb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffinvalid announce_intervalTa5d6ff"Tb4b4b4}
Tff7b72if Te6edf3interval Tff7b72< T79c0ff10Tb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffannounce_interval must be >= 10Ta5d6ff"Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ff_announce_interval Tff7b72= Te6edf3interval
Tff7b72if Tff7b72selfTff7b72.Td2a8ffservice Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3status Tff7b72= Tff7b72selfTff7b72.Td2a8ffserviceTff7b72.Td2a8ffget_statusTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3statusTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffrunningTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4, Ta5d6ff"Ta5d6ffalready_runningTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4, Tff7b72*Tff7b72*Te6edf3statusTb4b4b4}
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_sync_directoryTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3permissions Tff7b72= Tff7b72selfTff7b72.Td2a8ff_load_permissionsTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_permissions_cache Tff7b72= Te6edf3permissions
Te6edf3service Tff7b72= Te6edf3FileSyncServiceTb4b4b4(
Te6edf3identityTff7b72=Tff7b72selfTff7b72.Td2a8ffidentityTb4b4b4,
Te6edf3sync_directoryTff7b72=Tff7b72selfTff7b72.Td2a8ff_sync_directoryTb4b4b4,
Te6edf3storage_dirTff7b72=Tff7b72selfTff7b72.Td2a8ff_rootTb4b4b4,
Te6edf3reticulumTff7b72=Tff7b72selfTff7b72.Td2a8ffreticulumTb4b4b4,
Te6edf3permissionsTff7b72=Te6edf3permissionsTb4b4b4,
Te6edf3own_reticulumTff7b72=Tff7b72FalseTb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_wire_callbacksTb4b4b4(Te6edf3serviceTb4b4b4)
Te6edf3dest Tff7b72= Te6edf3serviceTff7b72.Td2a8ffstartTb4b4b4(
Te6edf3monitorTff7b72=Tff7b72selfTff7b72.Td2a8ff_monitorTb4b4b4,
Te6edf3announce_intervalTff7b72=Tff7b72selfTff7b72.Td2a8ff_announce_intervalTb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffservice Tff7b72= Te6edf3service
Tff7b72selfTff7b72.Td2a8ff_save_settingsTb4b4b4(Tb4b4b4)
Te6edf3status Tff7b72= Te6edf3serviceTff7b72.Td2a8ffget_statusTb4b4b4(Tb4b4b4)
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4,
Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4: Te6edf3destTb4b4b4,
Tff7b72*Tff7b72*Te6edf3statusTb4b4b4,
Tb4b4b4}
Tff7b72def Td2a8ffstopTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffservice Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4, Ta5d6ff"Ta5d6ffrunningTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4}
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffserviceTff7b72.Td2a8ffstopTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffservice Tff7b72= Tff7b72None
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4, Ta5d6ff"Ta5d6ffrunningTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4}
Tff7b72def Td2a8ffteardownTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstopTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_permissions_cache Tff7b72= Tff7b72None
Tff7b72def Td2a8fflist_peersTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657listTb4b4b4[Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4]Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffservice Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tb4b4b4[Tb4b4b4]
Tff7b72return Tff7b72selfTff7b72.Td2a8ffserviceTff7b72.Td2a8fflist_peersTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8fflist_filesTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657listTb4b4b4[Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4]Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffservice Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tb4b4b4[Tb4b4b4]
Tff7b72return Tff7b72selfTff7b72.Td2a8ffserviceTff7b72.Td2a8fflist_filesTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffconnect_peerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3identity_hashTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffservice Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fffilesync is not runningTa5d6ff"Tb4b4b4}
Te6edf3cleaned Tff7b72= Te6edf3_normalize_peer_hashTb4b4b4(Te6edf3identity_hashTb4b4b4)
Tff7b72if Te6edf3cleaned Tff7b72is Tff7b72None Tff7b72or Te6edf3cleaned Tff7b72== Ta5d6ff"Ta5d6ffallTa5d6ff"Tb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffinvalid identity_hashTa5d6ff"Tb4b4b4}
Tff7b72return Tff7b72selfTff7b72.Td2a8ffserviceTff7b72.Td2a8ffconnect_peerTb4b4b4(Te6edf3cleanedTb4b4b4)
Tff7b72def Td2a8ffdisconnect_peerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3peer_idTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffservice Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fffilesync is not runningTa5d6ff"Tb4b4b4}
Te6edf3cleaned Tff7b72= Tffa657strTb4b4b4(Te6edf3peer_id Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3cleanedTb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffpeer_id is requiredTa5d6ff"Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ffserviceTff7b72.Td2a8ffdisconnect_peerTb4b4b4(Te6edf3cleanedTb4b4b4)
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4, Ta5d6ff"Ta5d6ffpeer_idTa5d6ff"Tb4b4b4: Te6edf3cleanedTb4b4b4}
Tff7b72def Td2a8ffannounce_nowTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffservice Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fffilesync is not runningTa5d6ff"Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ffserviceTff7b72.Td2a8ffannounce_nowTb4b4b4(Tb4b4b4)
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4}
Tff7b72def Td2a8ffbrowse_peerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3peer_idTb4b4b4: Tffa657strTb4b4b4, Te6edf3timeoutTb4b4b4: Tffa657float Tff7b72= T79c0ff10.0Tb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffservice Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fffilesync is not runningTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fffilesTa5d6ff"Tb4b4b4: Tb4b4b4[Tb4b4b4]Tb4b4b4}
Te6edf3cleaned Tff7b72= Tffa657strTb4b4b4(Te6edf3peer_id Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3cleanedTb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffpeer_id is requiredTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fffilesTa5d6ff"Tb4b4b4: Tb4b4b4[Tb4b4b4]Tb4b4b4}
Tff7b72tryTb4b4b4:
Te6edf3timeout_f Tff7b72= Tffa657floatTb4b4b4(Te6edf3timeoutTb4b4b4)
Tff7b72except Tb4b4b4(Tf85149TypeErrorTb4b4b4, Tf85149ValueErrorTb4b4b4)Tb4b4b4:
Te6edf3timeout_f Tff7b72= T79c0ff10.0
Tff7b72if Te6edf3timeout_f Tff7b72< T79c0ff0.1Tb4b4b4:
Te6edf3timeout_f Tff7b72= T79c0ff0.1
Tff7b72if Te6edf3timeout_f Tff7b72> T79c0ff120.0Tb4b4b4:
Te6edf3timeout_f Tff7b72= T79c0ff120.0
Te6edf3files Tff7b72= Tff7b72selfTff7b72.Td2a8ffserviceTff7b72.Td2a8ffbrowse_peerTb4b4b4(Te6edf3cleanedTb4b4b4, Te6edf3timeoutTff7b72=Te6edf3timeout_fTb4b4b4)
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4, Ta5d6ff"Ta5d6ffpeer_idTa5d6ff"Tb4b4b4: Te6edf3cleanedTb4b4b4, Ta5d6ff"Ta5d6fffilesTa5d6ff"Tb4b4b4: Te6edf3filesTb4b4b4}
Tff7b72def Td2a8ffdownload_fileTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3peer_idTb4b4b4: Tffa657strTb4b4b4, Te6edf3pathTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffservice Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fffilesync is not runningTa5d6ff"Tb4b4b4}
Te6edf3cleaned_peer Tff7b72= Tffa657strTb4b4b4(Te6edf3peer_id Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Te6edf3cleaned_path Tff7b72= Tffa657strTb4b4b4(Te6edf3path Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3cleaned_peerTb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffpeer_id is requiredTa5d6ff"Tb4b4b4}
Tff7b72if Tff7b72not Te6edf3cleaned_pathTb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffpath is requiredTa5d6ff"Tb4b4b4}
Tff7b72tryTb4b4b4:
Te6edf3safe_path Tff7b72= Te6edf3normalize_relpathTb4b4b4(Te6edf3cleaned_pathTb4b4b4)
Tff7b72except Te6edf3PathJailError Tff7b72as Te6edf3excTb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Tffa657strTb4b4b4(Te6edf3excTb4b4b4)Tb4b4b4}
Tff7b72return Tff7b72selfTff7b72.Td2a8ffserviceTff7b72.Td2a8ffdownload_fileTb4b4b4(Te6edf3cleaned_peerTb4b4b4, Te6edf3safe_pathTb4b4b4)
Tff7b72def Td2a8ffget_aclTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Te6edf3permissions Tff7b72= Tff7b72selfTff7b72.Td2a8ff_permissionsTb4b4b4(Tb4b4b4)
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6ffenforceTa5d6ff"Tb4b4b4: Te6edf3permissionsTff7b72.Td2a8ffenabledTb4b4b4,
Ta5d6ff"Ta5d6ffrulesTa5d6ff"Tb4b4b4: Te6edf3permissionsTff7b72.Td2a8ffas_dictTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4}
Tff7b72def Td2a8ffupdate_aclTb4b4b4(
Tff7b72selfTb4b4b4,
Tff7b72*Tb4b4b4,
Te6edf3identity_hashTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Te6edf3permsTb4b4b4: Tffa657listTb4b4b4[Tffa657strTb4b4b4] Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Te6edf3enforceTb4b4b4: Tffa657bool Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Te6edf3rules_textTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Te6edf3replaceTb4b4b4: Tffa657bool Tff7b72= Tff7b72FalseTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72if Te6edf3replace Tff7b72or Te6edf3rules_text Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3permissions Tff7b72= Te6edf3PermissionStoreTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3rules_textTb4b4b4:
Te6edf3permissionsTff7b72.Td2a8ffload_allowed_textTb4b4b4(Te6edf3rules_textTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3permissions Tff7b72= Tff7b72selfTff7b72.Td2a8ff_permissionsTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3identity_hash Tff7b72is Tff7b72not Tff7b72None Tff7b72and Te6edf3perms Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3peer Tff7b72= Te6edf3_normalize_peer_hashTb4b4b4(Te6edf3identity_hashTb4b4b4)
Tff7b72if Te6edf3peer Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffinvalid identity_hashTa5d6ff"Tb4b4b4}
Te6edf3granted Tff7b72= Te6edf3permissionsTff7b72.Td2a8ffgrantTb4b4b4(Te6edf3peerTb4b4b4, Te6edf3permsTb4b4b4)
Tff7b72if Tff7b72not Te6edf3granted Tff7b72and Te6edf3permsTb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffno valid permissions providedTa5d6ff"Tb4b4b4}
Tff7b72if Te6edf3enforce Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3permissionsTff7b72.Td2a8ff_enforce Tff7b72= Tffa657boolTb4b4b4(Te6edf3enforceTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffservice Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffserviceTff7b72.Td2a8ffpermissions Tff7b72= Te6edf3permissions
Tff7b72selfTff7b72.Td2a8ff_save_aclTb4b4b4(Te6edf3permissionsTb4b4b4)
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4,
Ta5d6ff"Ta5d6ffenforceTa5d6ff"Tb4b4b4: Te6edf3permissionsTff7b72.Td2a8ffenabledTb4b4b4,
Ta5d6ff"Ta5d6ffrulesTa5d6ff"Tb4b4b4: Te6edf3permissionsTff7b72.Td2a8ffas_dictTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4}
Tff7b72def Td2a8ffupdate_settingsTb4b4b4(
Tff7b72selfTb4b4b4,
Tff7b72*Tb4b4b4,
Te6edf3sync_directoryTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Te6edf3monitorTb4b4b4: Tffa657bool Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Te6edf3announce_intervalTb4b4b4: Tffa657int Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Te6edf3running Tff7b72= Tff7b72False
Tff7b72if Tff7b72selfTff7b72.Td2a8ffservice Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3running Tff7b72= Tffa657boolTb4b4b4(Tff7b72selfTff7b72.Td2a8ffserviceTff7b72.Td2a8ffget_statusTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffrunningTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3sync_directory Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72if Te6edf3runningTb4b4b4:
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4,
Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffstop filesync before changing sync directoryTa5d6ff"Tb4b4b4,
Tb4b4b4}
Te6edf3resolved Tff7b72= Tff7b72selfTff7b72.Td2a8ff_resolve_sync_directoryTb4b4b4(Te6edf3sync_directoryTb4b4b4)
Tff7b72if Te6edf3resolved Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4,
Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffsync_directory must stay under identity storageTa5d6ff"Tb4b4b4,
Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ff_sync_directory Tff7b72= Te6edf3resolved
Tff7b72if Te6edf3monitor Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_monitor Tff7b72= Tffa657boolTb4b4b4(Te6edf3monitorTb4b4b4)
Tff7b72if Te6edf3announce_interval Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3interval Tff7b72= Tffa657intTb4b4b4(Te6edf3announce_intervalTb4b4b4)
Tff7b72except Tb4b4b4(Tf85149TypeErrorTb4b4b4, Tf85149ValueErrorTb4b4b4)Tb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffinvalid announce_intervalTa5d6ff"Tb4b4b4}
Tff7b72if Te6edf3interval Tff7b72< T79c0ff10Tb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffannounce_interval must be >= 10Ta5d6ff"Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ff_announce_interval Tff7b72= Te6edf3interval
Tff7b72selfTff7b72.Td2a8ff_save_settingsTb4b4b4(Tb4b4b4)
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4,
Ta5d6ff"Ta5d6ffsync_directoryTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_sync_directoryTb4b4b4,
Ta5d6ff"Ta5d6ffmonitorTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_monitorTb4b4b4,
Ta5d6ff"Ta5d6ffannounce_intervalTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_announce_intervalTb4b4b4,
Ta5d6ff"Ta5d6ffrunningTa5d6ff"Tb4b4b4: Te6edf3runningTb4b4b4,
Tb4b4b4}
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────